# Makefile for Fingerprint Library
CC = gcc
CFLAGS = -fPIC -Wall -Wextra -O2 -g -std=c99
LDFLAGS = -shared
TARGET = libfp.so
SOURCES = src/fp_lib.c
OBJECTS = $(SOURCES:.c=.o)
INCLUDE_DIR = include
LIB_DIR = lib

# 默认目标
.PHONY: all clean install uninstall test run demo

all: $(TARGET)

# 创建库目录
$(LIB_DIR):
	mkdir -p $(LIB_DIR)

# 编译目标库
$(TARGET): $(OBJECTS) | $(LIB_DIR)
	$(CC) $(LDFLAGS) -o $(LIB_DIR)/$@ $^
	@echo "Library built: $(LIB_DIR)/$@"

# 编译源文件
%.o: %.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -I$(INCLUDE_DIR) -c $< -o $@

# 清理构建文件
clean:
	rm -rf $(OBJECTS) $(LIB_DIR) build/

# 安装到系统
install: $(TARGET)
	@if [ "$(EUID)" -ne 0 ]; then \
		echo "Please run as root (use sudo)"; \
		exit 1; \
	fi
	sudo cp $(LIB_DIR)/$(TARGET) /usr/local/lib/
	sudo cp $(INCLUDE_DIR)/*.h /usr/local/include/
	sudo ldconfig
	@echo "Library installed to /usr/local/lib/"

# 卸载
uninstall:
	@if [ "$(EUID)" -ne 0 ]; then \
		echo "Please run as root (use sudo)"; \
		exit 1; \
	fi
	sudo rm -f /usr/local/lib/$(TARGET)
	sudo rm -f /usr/local/include/fp_lib.h
	sudo ldconfig
	@echo "Library uninstalled"

# 运行示例程序
run: $(TARGET)
	@echo "Building fingerprint library demo..."
	$(CC) -o examples/fp_demo examples/fp_demo.c -I$(INCLUDE_DIR) -L$(LIB_DIR) -lfp
	@echo "Demo program built. Run with:"
	@echo "export LD_LIBRARY_PATH=\$$(pwd)/lib:\$$LD_LIBRARY_PATH"
	@echo "./examples/fp_demo"

# 运行测试
test: $(TARGET)
	@echo "Building and running tests..."
	$(CC) -o tests/test_fp tests/test_fp.c -I$(INCLUDE_DIR) -L$(LIB_DIR) -lfp
	@echo "Tests built. Run with:"
	@echo "export LD_LIBRARY_PATH=\$$(pwd)/lib:\$$LD_LIBRARY_PATH"
	@echo "./tests/test_fp"

# 运行演示程序
demo: $(TARGET)
	@echo "Building fingerprint demo..."
	$(CC) -o examples/fp_demo examples/fp_demo.c -I$(INCLUDE_DIR) -L$(LIB_DIR) -lfp
	@echo "Demo built. Run with:"
	@echo "export LD_LIBRARY_PATH=\$$(pwd)/lib:\$$LD_LIBRARY_PATH"
	@echo "./examples/fp_demo"

# 显示帮助信息
help:
	@echo "Available targets:"
	@echo "  all       - Build the fingerprint library"
	@echo "  clean     - Remove build files"
	@echo "  install   - Install library to system (requires sudo)"
	@echo "  uninstall - Remove library from system (requires sudo)"
	@echo "  test      - Build and run tests"
	@echo "  run       - Build and run example program"
	@echo "  demo      - Build and run demo program"
	@echo "  help      - Show this help message"

# 检查依赖
check-deps:
	@echo "Checking dependencies..."
	@which $(CC) > /dev/null || (echo "Error: $(CC) not found" && exit 1)
	@echo "Dependencies OK"

# 显示库信息
info: $(TARGET)
	@echo "Library information:"
	@file $(LIB_DIR)/$(TARGET)
	@echo "Symbols:"
	@nm -D $(LIB_DIR)/$(TARGET) | grep -E " [Tt] " | head -10
	@echo "Dependencies:"
	@ldd $(LIB_DIR)/$(TARGET)

# 创建开发包
package: $(TARGET)
	@echo "Creating development package..."
	@mkdir -p package/include package/lib package/examples package/docs
	cp $(INCLUDE_DIR)/*.h package/include/
	cp $(LIB_DIR)/$(TARGET) package/lib/
	cp examples/*.c package/examples/
	cp README.md package/docs/
	@echo "Package created in 'package/' directory"

# 静态分析
analyze: $(OBJECTS)
	@echo "Running static analysis..."
	@if command -v cppcheck >/dev/null 2>&1; then \
		cppcheck --enable=all --std=c99 $(INCLUDE_DIR) $(SOURCES); \
	else \
		echo "cppcheck not found, skipping static analysis"; \
	fi

# 代码格式化
format:
	@echo "Formatting code..."
	@if command -v clang-format >/dev/null 2>&1; then \
		clang-format -i $(SOURCES) $(INCLUDE_DIR)/*.h; \
		echo "Code formatted with clang-format"; \
	else \
		echo "clang-format not found, skipping formatting"; \
	fi 